﻿#region Header
// Copyright (c) 2015 OPEN TONE, Inc.
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
#endregion
using System;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace OpenXmlLib.Excel.Impl
{
	/// <summary>
	/// Worksheet実装
	/// </summary>
	public class WorksheetImpl : IWorksheet
	{
		// WorksheetPartオブジェクト
		private readonly WorksheetPart worksheetPart;

		/// <summary>
		/// 
		/// </summary>
		/// <see cref="IWorksheet.Workbook"/>
		public IWorkbook Workbook { get; private set; }

		/// <summary>
		/// コンストラクタ
		/// </summary>
		private WorksheetImpl() { }

		/// <summary>
		/// コンストラクタ
		/// </summary>
		/// <param name="workbook">IWorkbookオブジェクト</param>
		/// <param name="worksheetPart">WorksheetPartオブジェクト</param>
		internal WorksheetImpl(IWorkbook workbook, WorksheetPart worksheetPart)
		{
			this.Workbook = workbook;
			this.worksheetPart = worksheetPart;
		}

		/// <summary>
		/// 指定したセル位置に対応するCellHaオブジェクトを取得します。
		/// </summary>
		/// <param name="cellAddress">シート名</param>
		/// <returns>CellHandlerオブジェクト。該当するセル位置が無いか、値が設定されていない場合はnull</returns>
		public ICell GetCell(String cellAddress)
		{
			ICell cell = null;
			foreach (Cell c in worksheetPart.Worksheet.Descendants<Cell>())
			{
				if (c.CellReference.ToString().Equals(cellAddress, StringComparison.OrdinalIgnoreCase))
				{
					cell = new CellImpl(this, c);
					break;
				}
				if (null == cell)
				{
					// 値が設定されていないセルにはCellオブジェクトが存在しない場合がある。
					// その場合はCellオブジェクトをnullにしてインスタンスを作成する。
					cell = new CellImpl(this);
				}
			}
			return cell;
		}
	}
}
